package com.panda.common.memcached;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.danga.MemCached.MemCachedClient;

public class MemcachedManager{
	
	private static MemCachedClient mcc;
	
	private static MemCachedClient getMemCachedClient(){
		if(mcc==null){
			mcc = MemcachedFactory.getInstance().getMcc();
		}
		return mcc;
	}
//	/**
//	 * 添加缓存对象键值
//	 * @param key
//	 * @param ob
//	 * @return
//	 * @throws Exception 
//	 */
//	public static boolean set(String key,Object value) {
//		return getMemCachedClient().set(key, value);
//	}
	
	/**
	 * 添加缓存对象键值,有生命周期
	 * @param key
	 * @param ob
	 * @param time 单位 ms
	 * @return
	 * @throws Exception 
	 */
	public static boolean set(String key,Object value, long time) {
		return getMemCachedClient().set(key, value , new Date(time));
	}
	
	/**
	 * 添加缓存对象键值
	 * @param key
	 * @param ob
	 * @return
	 * @throws Exception 
	 */
	public static boolean add(String key,Object value) {
		return getMemCachedClient().add(key, value);
	}
	
	
	/**
	 * 添加一个缓存对象键值,并且有生命周期
	 * @param key
	 * @param ob
	 * @param time
	 * @return
	 */
	public static boolean add(String key,Object value,int time){
		return getMemCachedClient().add(key, value, new Date(time));
	}
	
	/**
	 * 删除某个缓存对象
	 * @param key
	 * @return
	 */
	public static boolean delete(String key){
		return getMemCachedClient().delete(key);
	}
	
	/**
	 * 在该时间内服务器会拒绝对于此键名的add和replace命令。
	 * 此时内容被放入delete队列，无法再通过get得到该内容，
	 * 也无法是用add和replace方法（但是set命令可用）。
	 * 直到指定时间，这些内容被最终从服务器的内存中彻底清除
	 * @param key
	 * @param time 是一个单位为秒的时间（或代表直到某一刻的Unix时间） 缺省为0（表示内容会立刻清除，并且随后的存储命令均可用）
	 * @return
	 * @throws Exception
	 */
	public static boolean delete(String key,Date time){
		return getMemCachedClient().delete(key, time);
	}
	
	/**
	 * 覆盖某个缓存对象,没有过期时间
	 * @param key
	 * @param value
	 * @return
	 */
	public static boolean replace(String key, Object value){
		return getMemCachedClient().replace(key, value);
	}
	
	/**
	 * 覆盖某个缓存对象,并有过期时间
	 * @param key
	 * @param value
	 * @param time
	 * @return
	 */
	public static boolean replace(String key, Object value, int time){
		return getMemCachedClient().replace(key, value, new Date(time));
	}
	
	 /**
     * 根据指定的关键字获取对象.
     * @param key
     * @return
     */
    public static Object get(String key){
        return getMemCachedClient().get(key);
    }
	/**
	 * 一次获取多个缓存对象
	 * @param keys
	 * @param values
	 * @return
	 * @throws Exception
	 */
	public static Map getMultiObject(String[] keys,Integer[] values){
		Map obs = getMemCachedClient().getMulti(keys,values);
		return obs;
	}
	
	public static boolean keyExists(String key){
		return getMemCachedClient().keyExists(key);
	}
	
	/**
	 *清空MemCachedClient中所有对象
	 *flushAll 实际上没有立即释放项目所占用的内存而是在随后陆续有新的项目被储存时执行。
	 *flushAll 效果具体如下：它导致所有更新时间早于flushAll所设定时间的项目，在被执行取回命令时命令被忽略。
	 */
	public static boolean flushAllObject(){
		return getMemCachedClient().flushAll();
	}
	
	
	/**
	 * 得到当前服务器的状态信息
	 * @return
	 */
	public static Map getMemCachedClientStates(){
		return getMemCachedClient().stats();
	}
	
	public static void main(String[] args) throws Exception{
		long startTime = System.currentTimeMillis();
		for(int i=0;i<1;i++){
			List<String> valueList = new ArrayList<String>();
			for(int j=0;j<100000;j++){
				MemcachedManager.set("list"+i, "eeeesfsdfesdfdsfsdfeeeeeeeeeeeeeeeeeeeeeeeeeeeeee["+j+"]["+i+"]",10000);
//				valueList.add("eeeesfsdfesdfdsfsdfeeeeeeeeeeeeeeeeeeeeeeeeeeeeee["+j+"]["+i+"]");
			}
//			MemcachedManager.set("list"+i, valueList,10000);
//			MemCachedManager.get("list"+i);
		}
		long endTime = System.currentTimeMillis();
		String logDotime = "用时["+(endTime - startTime)+"]ms";
		System.out.println(logDotime);
		
		
		
		
		
		
//		try {
//			Map stats = MemCachedManager.getMemCachedClientStates();
//
//			for(Object obj : stats.keySet()){
//				Map map = (Map)stats.get(obj);
//				System.out.println("+++++++++++++++++++++++"+obj.toString()+"++++++++++++++++++++++");
//				for(Object o : map.keySet()){
//					String m = (String) map.get(o);
//					System.out.println(o.toString()+": ["+ m +"]");
//				}
//			}
//		} catch (RuntimeException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
	}
}
